home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 September / PCWorld_2006-09_cd.bin / v cisle / hexer / mpth_17.exe / {app} / scripts / Structure Viewer / exe.mps < prev    next >
Text File  |  2006-03-19  |  11KB  |  355 lines

  1. option title, "Windows executable (.exe, .dll ...) structure"
  2. =
  3. =
  4. =    Tiny Hexer script for .EXE structure view in
  5. =    mirkes.de's tiny hex editor
  6. =
  7. =    (C) markus stephany, tinyhexer[at]mirkes[dot]de
  8. =
  9. INCLUDE 'def.mps'
  10.  
  11.  
  12. option GlobalVars, 1
  13. option ReadTags, 1
  14. option target, structureviewer
  15.  
  16. var d1 dword d2 dword
  17. var importrva dword importptr dword
  18. var exportrva dword exportptr dword
  19. var secstart dword numsect word
  20.  
  21. = "array" of section va, datasize and raw pointer
  22. var sect_va text sect_ds text sect_rp text
  23.  
  24. = open active editor and goto current position/0
  25. var editor file
  26. editor = fileopen('::current')
  27. if ((param_count > 0) and (dword(params(0))==1))
  28.   fileseek editor, 0
  29. else
  30.   fileseek editor, filegetprop(editor, 'selstart')
  31. endif
  32. var start dword
  33. start = filegetprop(editor, 'position')
  34.  
  35. = open browser window
  36. var browser file
  37. browser = fileopen('::browser', 'c')
  38.  
  39. filesetprop browser, 'accepttags', 1
  40. filewrite browser "<font color=",'"',"blue",'"',"><b><u>Portable Executable structure:</u></b></font>\n\n"
  41. filesetprop browser, 'accepttags', 0
  42.  
  43. filewrite browser "File: '",filegetprop(editor, 'filename'),"'\nPosition: ",start,"\n\n"
  44.  
  45.  
  46. = read the EXE header
  47. var _word word _dword dword _text text ipos qword
  48. ipos = filepos(editor)
  49. fileread editor _word
  50.  
  51. if  _word != 0x5a4d
  52.   error 'Unknown file format'
  53. endif
  54.  
  55.  
  56. = print dos header
  57. filewrite browser "struct _IMAGE_DOS_HEADER {\n"
  58. _text = data2text(_word)
  59. copytags _text _word
  60. filewrite browser " WORD\te_magic\t\t'",_text,"'\t(",_word,")\n"
  61. fileread editor _word
  62. filewrite browser " WORD\te_cblp\t\t",_word,"\n"
  63. fileread editor _word
  64. filewrite browser " WORD\te_cp\t\t",_word,"\n"
  65. fileread editor _word
  66. filewrite browser " WORD\te_crlc\t\t",_word,"\n"
  67. fileread editor _word
  68. filewrite browser " WORD\te_cparhdr\t",_word,"\n"
  69. fileread editor _word
  70. filewrite browser " WORD\te_minalloc\t",_word,"\n"
  71. fileread editor _word
  72. filewrite browser " WORD\te_maxalloc\t",_word,"\n"
  73. fileread editor _word
  74. filewrite browser " WORD\te_ss\t\t",_word,"\n"
  75. fileread editor _word
  76. filewrite browser " WORD\te_sp\t\t",_word,"\n"
  77. fileread editor _word
  78. filewrite browser " WORD\te_csum\t\t",_word,"\n"
  79. fileread editor _word
  80. filewrite browser " WORD\te_ip\t\t",_word,"\n"
  81. fileread editor _word
  82. filewrite browser " WORD\te_cs\t\t",_word,"\n"
  83. fileread editor _word
  84. filewrite browser " WORD\te_lfarlc\t",_word,"\n"
  85. fileread editor _word
  86. filewrite browser " WORD\te_ovno\t\t",_word,"\n"
  87. filewrite browser " WORD\te_res[4]\t":call WORDOUT 4:filewrite browser "\n"
  88. fileread editor _word
  89. filewrite browser " WORD\te_oemid\t\t",_word,"\n"
  90. fileread editor _word
  91. filewrite browser " WORD\te_oeminfo\t",_word,"\n"
  92. filewrite browser " WORD\te_res2[10]\t":call WORDOUT 10:filewrite browser "\n"
  93. fileread editor _dword
  94. filewrite browser " LONG\te_lfanew\t",_dword,"\n}\n\n"
  95. fileseek editor, (ipos + _dword)
  96.  
  97. filewrite browser "Position: ",filepos(editor),"\n"
  98.  
  99. fileread editor _dword
  100.  
  101. if  _dword != 0x4550
  102.   error 'File is not in PE format'
  103. endif
  104.  
  105. = print magic and file header
  106. _text = data2text(word(_dword))
  107. copytags _text _dword
  108. filewrite browser "DWORD\tmagic\t'",_text,"'\t(",_dword,")\n\n"
  109.  
  110. var wsopt word
  111. filewrite browser "struct _IMAGE_FILE_HEADER {\n"
  112. fileread editor _word
  113. filewrite browser " WORD\tMachine\t\t\t",_word,"\n"
  114. fileread editor numsect
  115. filewrite browser " WORD\tNumberOfSections\t",numsect,"\n"
  116. fileread editor _dword
  117. filewrite browser " DWORD\tTimeDateStamp\t\t",_dword,"\n"
  118. fileread editor _dword
  119. filewrite browser " DWORD\tPointerToSymbolTable\t",_dword,"\n"
  120. fileread editor _dword
  121. filewrite browser " DWORD\tNumberOfSymbols\t\t",_dword,"\n"
  122. fileread editor wsopt
  123. filewrite browser " WORD\tSizeOfOptionalHeader\t",wsopt,"\n"
  124. fileread editor _word
  125. filewrite browser " WORD\tCharacteristics\t\t",_word,"\n}\n\n"
  126.  
  127. if wsopt > 0
  128.   var _byte byte rva dword
  129.   filewrite browser "struct _IMAGE_OPTIONAL_HEADER {\n"
  130.   fileread editor _word
  131.   filewrite browser " WORD\tMagic\t\t\t",_word,"\n"
  132.   fileread editor _byte
  133.   filewrite browser " BYTE\tMajorLinkerVersion\t",_byte,"\n"
  134.   fileread editor _byte
  135.   filewrite browser " BYTE\tMinorLinkerVersion\t",_byte,"\n"
  136.   fileread editor _dword
  137.   filewrite browser " DWORD\tSizeOfCode\t\t",_dword,"\n"
  138.   fileread editor _dword
  139.   filewrite browser " DWORD\tSizeOfInitializedData\t",_dword,"\n"
  140.   fileread editor _dword
  141.   filewrite browser " DWORD\tSizeOfUninitializedData\t",_dword,"\n"
  142.   fileread editor _dword
  143.   filewrite browser " DWORD\tAddressOfEntryPoint\t",_dword,"\n"
  144.   fileread editor _dword
  145.   filewrite browser " DWORD\tBaseOfCode\t\t",_dword,"\n"
  146.   fileread editor _dword
  147.   filewrite browser " DWORD\tBaseOfData\t\t",_dword,"\n"
  148.   fileread editor _dword
  149.   filewrite browser " DWORD\tImageBase\t\t",_dword,"\n"
  150.   fileread editor _dword
  151.   filewrite browser " DWORD\tSectionAlignment\t",_dword,"\n"
  152.   fileread editor _dword
  153.   filewrite browser " DWORD\tFileAlignment\t\t",_dword,"\n"
  154.   fileread editor _word
  155.   filewrite browser " WORD\tMajorOSVersion\t\t",_word,"\n"
  156.   fileread editor _word
  157.   filewrite browser " WORD\tMinorOSVersion\t\t",_word,"\n"
  158.   fileread editor _word
  159.   filewrite browser " WORD\tMajorImageVersion\t",_word,"\n"
  160.   fileread editor _word
  161.   filewrite browser " WORD\tMinorImageVersion\t",_word,"\n"
  162.   fileread editor _word
  163.   filewrite browser " WORD\tMajorSubsystemVersion\t",_word,"\n"
  164.   fileread editor _word
  165.   filewrite browser " WORD\tMinorSubsystemVersion\t",_word,"\n"
  166.   fileread editor _dword
  167.   filewrite browser " DWORD\tReserved1\t\t",_dword,"\n"
  168.   fileread editor _dword
  169.   filewrite browser " DWORD\tSizeOfImage\t\t",_dword,"\n"
  170.   fileread editor _dword
  171.   filewrite browser " DWORD\tSizeOfHeaders\t\t",_dword,"\n"
  172.   fileread editor _dword
  173.   filewrite browser " DWORD\tCheckSum\t\t",_dword,"\n"
  174.   fileread editor _word
  175.   filewrite browser " WORD\tSubsystem\t\t",_word,"\n"
  176.   fileread editor _word
  177.   filewrite browser " WORD\tDllCharacteristics\t",_word,"\n"
  178.   fileread editor _dword
  179.   filewrite browser " DWORD\tSizeOfStackReserve\t",_dword,"\n"
  180.   fileread editor _dword
  181.   filewrite browser " DWORD\tSizeOfStackCommit\t",_dword,"\n"
  182.   fileread editor _dword
  183.   filewrite browser " DWORD\tSizeOfHeapReserve\t",_dword,"\n"
  184.   fileread editor _dword
  185.   filewrite browser " DWORD\tSizeOfHeapCommit\t",_dword,"\n"
  186.   fileread editor _dword
  187.   filewrite browser " DWORD\tLoaderFlags\t\t",_dword,"\n"
  188.   fileread editor rva
  189.   filewrite browser " DWORD\tNumberOfRvaAndSizes\t",rva,"\n"
  190.   filewrite browser " IMAGE_DATA_DIRECTORY DataDirectory[",rva,"] {\n"
  191.   call data_dir
  192.   exportrva = d1:= first entry: pointer to export table rva
  193.   call data_dir
  194.   importrva = d1:= second entry: pointer to import table rva
  195.   loop data_dir, (rva-2)
  196.   filewrite browser " }\n"
  197.   filewrite browser "}\n\n"
  198. endif
  199. secstart = filepos(editor)
  200. loop section, numsect
  201.  
  202. = check export table
  203. call rvatoabs exportrva:pop exportptr
  204. if (exportptr != 0)
  205.   tagvar exportptr, exportptr, 0
  206.   filewrite browser "\nexport table at ",exportptr,"\n"
  207. endif
  208.  
  209. = check import table
  210. call rvatoabs importrva:pop importptr
  211. if (importptr != 0)
  212.   fileseek editor importptr
  213.   tagvar importptr, importptr, 0
  214.   filewrite browser "\n================================================================\n"
  215.   filewrite browser "import table at ",importptr,"\n\n"
  216.   var i1 dword i2 dword i3 dword i4 dword i5 dword p_i dword i_ dword t_ text pi1 dword
  217.   var i6 dword
  218.   repeat
  219.     fileread editor i1
  220.     fileread editor i2
  221.     fileread editor i3
  222.     fileread editor i4
  223.     fileread editor i5
  224.     if i1 or i2 or i3 or i4 or i5 
  225.       p_i = filepos(editor)
  226.       filewrite browser "struct IMAGE_IMPORT_DESCRIPTOR {\n"
  227.       filewrite browser " DWORD\tOriginalFirstThunk\t",i1,"\n"
  228.       filewrite browser " DWORD\tTimeDateStamp\t\t",i2,"\n"
  229.       filewrite browser " DWORD\tForwarderChain\t\t",i3,"\n"
  230.       call rvatoabs i4: pop i_
  231.       fileseek editor i_
  232.       fileread editor t_
  233.       tagvar t_, i_, textlen(t_)
  234.       filewrite browser " DWORD\tName\t\t\t",i4,"\t'",t_,"'\n"
  235.       filewrite browser " DWORD\tFirstThunk\t\t",i5,"\n"
  236.       filewrite browser "}\n" 
  237.       if i1 == 0
  238.         call rvatoabs i5
  239.       else
  240.         call rvatoabs i1
  241.       endif
  242.       pop i_
  243.       tagvar i_, i_, 0
  244.       filewrite browser "Imported functions (IMAGE_THUNK_DATA records at ",i_,"):\n"
  245.       = msgbox text(i5)+'/'+text(i_) 
  246.       fileseek editor i_
  247.       repeat
  248.         fileread editor i6
  249.         pi1 = filepos(editor)
  250.         if i6 
  251.           if (i6 >= 0x8000000)
  252.             var n1 none
  253.             copytags n1 i6
  254.             i6 = i6 and 0x0fffffff
  255.             copytags i6 n1
  256.             filewrite browser " Ordinal:   ",i6,"\n"
  257.           else
  258.             call rvatoabs i6:pop i_
  259.             fileseek editor i_
  260.             var hint word
  261.             fileread editor hint
  262.             fileread editor t_
  263.             filewrite browser " WORD Hint: ",hint,"\t\tName: '",t_,"'\n"
  264.             fileseek editor pi1
  265.           endif 
  266.         endif
  267.       until not i6
  268.       fileseek editor p_i
  269.       filewrite browser "\n\n" 
  270.     endif
  271.   until not (i1 or i2 or i3 or i4 or i5)
  272. endif
  273.  
  274. fileclose browser
  275. fileclose editor
  276. end
  277.  
  278. @@data_dir:= print a data directory
  279. fileread editor d1
  280. fileread editor d2
  281. filewrite browser "\t(DWORD VirtualAddress ",d1,", DWORD Size ",d2,")\n"
  282. return
  283.  
  284. @@section:= output a section
  285. filewrite browser "\nPosition: ", filepos(editor),"\n"
  286. filewrite browser "================================================================\n\n"
  287. var sectn text ds1 dword
  288. fileread editor sectn 8
  289. filewrite browser "struct _IMAGE_SECTION_HEADER {\n"
  290. filewrite browser " char\tName[8]\t\t\t'",sectn,"'\n"
  291. fileread editor _dword
  292. filewrite browser " DWORD\tVirtualSize\t\t",_dword,"\n"
  293. fileread editor _dword
  294. concat sect_va data2text(_dword)
  295. filewrite browser " DWORD\tVirtualAddress\t\t",_dword,"\n"
  296. fileread editor ds1
  297. concat sect_ds data2text(ds1)
  298. filewrite browser " DWORD\tSizeOfRawData\t\t",ds1,"\n"
  299. fileread editor d2
  300. concat sect_rp data2text(d2)
  301. sectn = "PointerToRawData"
  302. tagvar sectn, (d2 + ipos),ds1
  303. filewrite browser " DWORD\t",sectn,"\t",d2,"\n"
  304. fileread editor _dword
  305. filewrite browser " DWORD\tPointerToRelocations\t",_dword,"\n"
  306. fileread editor _dword
  307. filewrite browser " DWORD\tPointerToLinenumbers\t",_dword,"\n"
  308. fileread editor _word
  309. filewrite browser " WORD\tNumberOfRelocations\t",_word,"\n"
  310. fileread editor _word
  311. filewrite browser " WORD\tNumberOfLinenumbers\t",_word,"\n"
  312. fileread editor _dword
  313. filewrite browser " DWORD\tCharacteristics\t\t",_dword,"\n}\n"
  314. return
  315.  
  316. @@WORDOUT:= output a word
  317. var w word w1 word
  318. pop w
  319. repeat
  320.   fileread editor w1
  321.   filewrite browser w1 
  322.   inc w -1
  323.   if w > 0
  324.     filewrite browser ", "
  325.   endif
  326. until w == 0
  327. return
  328.  
  329.  
  330. @@rvatoabs:= convert an rva to an absolute address
  331. = va in sect_va
  332. = ds in sect_ds
  333. = rp in sect_rp
  334. var r_va dword r_ds dword r_rp dword
  335. var r_i dword
  336. var r_val dword
  337. r_i = 0
  338. pop r_val
  339. if numsect
  340.   repeat
  341.     r_va = text2data(sect_va, r_i, 4)
  342.     r_ds = text2data(sect_ds, r_i, 4)
  343.     r_rp = text2data(sect_rp, r_i, 4)
  344.     inc r_i 1
  345.     if (r_val >= r_va) and ((r_va + r_ds) >= r_val)
  346.        inc r_val,  (r_rp-r_va)
  347.        goto rva_end
  348.     endif
  349.   until (r_i == numsect)
  350. endif
  351. @@rva_end
  352. push r_val
  353. return
  354.  
  355.